<?php
/**
 * Subclase para el manejo de los catálogos.
 *
 * @package    Siga
 * @subpackage lib
 * @author     Grupo Desarrollo Cidesa <desarrollo@cidesa.com.ve>
 * @version    SVN: $Id: $
 * @copyright  Copyright 2007, Cidesa C.A.
 * 
 */
class CatalogoWeb
{
  
  var $columnas;
  var $pager;
  var $mapa_tabla;
  var $opciones;
  var $clase = '';
  var $metodo = '';
  var $metodoPeer;
  var $c;
  var $filters;
  
  public function CatalogoWeb()
  {
    
  }
  
  /*
   * Construye la información necesaria del catálogo
   * 
   * @param array $fdatos Contiene 2 campos uno llamado 'metodo' y otro 'clase'
   * @param array $objetos Arreglo con los objetos a actualziar. key = campo, value = objetos html 
   * @return bool verdadero si encontro datos.  
   */
  public function Construir($fdatos,$objetos,$opciones = array())
  {
    $objs = array();
    $this->opciones = $opciones;
    
    // $objs[][0] = Nombre del campo que tiene la información a ser devuelta.
    // $objs[][1] = Nombre del objeto donde se colocará la información del campo
    
    foreach ($objetos as $obj) {
    	$arr = spliti('_',$obj);
    	if(count($arr)>1){
    	  $objs[] = array($fdatos,$arr[1]);
    	}
    }
    
    if(is_callable(array($this,$fdatos['metodo']))){
      
      $this->clase = ucfirst(strtolower($fdatos['clase'])) ;
      
      $this->metodo = $fdatos['metodo'] ;
      $eval = '$clase = new '.$this->clase.';';
      eval($eval);
      $this->clasePeer = $clase->getPeer();
      
      $this->mapa_tabla = $this->clasePeer->getTableMap();
      $metodo = $this->metodo;      
      
      $this->$metodo();
      
    }else{

      $this->clase = ucfirst(strtolower($fdatos['clase'])) ;
      
      $eval = '$clase = new '.$this->clase.';';
      eval($eval);
      $this->clasePeer = $clase->getPeer();
      
      $this->mapa_tabla = $this->clasePeer->getTableMap();
      
      $this->columnas =  $this->clasePeer->getColumsNames();
      $this->c = new Criteria();
    }
    
  }
  
  public function Caordcom_Almajuoc()
  {
    // Se debe crear el arreglo $campos con los campos a mostrar en el catálogo
    // Cada campo tiene la siguiente estructura    
    // $columnas[]['campo'] = 'Información a colocar en la cabecera'
    // ó
    // $columnas[] = 'campo' => 'Información a colocar en la cabecera'.
    // ó 
    // $columnas = array (CaordcomPeer::ORDCOM => 'Código', CaordcomPeer::FECORD => 'Fecha', CaordcomPeer::DESORD => 'Descripción');

    $this->columnas = array (CaordcomPeer::ORDCOM => 'Código', CaordcomPeer::FECORD => 'Fecha', CaordcomPeer::DESORD => 'Descripción');
    
    // Se genera el criterio para el pager 
    
    $this->c = new Criteria();
        
  }
  
  public function getPager()
  {
    $this->processSort();

    $this->processFilters();

    // pager
    $this->pager = new sfPropelPager($this->clase, 10);
    //print 'Clase='.$this->clase;
    if(!isset($this->c)) $this->c = new Criteria();
    $this->addSortCriteria();
    $this->addFiltersCriteria();
    $this->pager->setCriteria($this->c);
    $this->pager->setPage($this->getOpciones('page',1));
    $this->pager->init();
    
    return $this->pager; 
  }
  
  public function getCampos(){return $this->columnas;}
  
  protected function processFilters()
  {
    if (isset($this->opciones['filter']))
    {
      $filters = $this->opciones['filter'];
      
      foreach ($filters as $key => $campo) {

        $creoletype = $this->getColumCreoleType($key);
        
      	if($creoletype == CreoleTypes::DATE){
          if (isset($filters[$key]['from']) && $filters[$key]['from'] !== '')
          {
            $filters[$key]['from'] = sfI18N::getTimestampForCulture($filters[$key]['from'], 'en_US');
          }
          if (isset($filters['fecaju']['to']) && $filters['fecaju']['to'] !== '')
          {
            $filters[$key]['to'] = sfI18N::getTimestampForCulture($filters['fecaju']['to'], 'en_US');
          }
      	}elseif($creoletype == CreoleTypes::NUMERIC){
      	  
      	}
      }
      $this->filters = $filters;
    }
  }

  protected function processSort()
  {
    /*
    if ($this->getRequestParameter('sort'))
    {
      $this->getUser()->setAttribute('sort', $this->getRequestParameter('sort'), 'sf_admin/caajuoc/sort');
      $this->getUser()->setAttribute('type', $this->getRequestParameter('type', 'asc'), 'sf_admin/caajuoc/sort');
    }

    if (!$this->getUser()->getAttribute('sort', null, 'sf_admin/caajuoc/sort'))
    {
    }
	*/
  }

  protected function addFiltersCriteria()
  {
    if(isset($this->filters) && is_array($this->filters)){
    
    foreach ($this->filters as $key => $objhtml) {
      
      $creoletype = $this->getColumCreoleType($key);

      if (isset($this->filters[$key.'_is_empty']))
      {
        $eval = '$criterion = $this->c->getNewCriterion('.$this->clase.'Peer::'.strtoupper($key).', "");';
        eval($eval);
        $eval = '$criterion->addOr($this->c->getNewCriterion('.$this->clase.'Peer::'.strtoupper($key).', null, Criteria::ISNULL));';
        eval($eval);
        $c->add($criterion);
      }else
      {
   	    if($creoletype == CreoleTypes::DATE){
          if (isset($this->filters[$key]))
          {
            if (isset($this->filters[$key]['from']) && $this->filters[$key]['from'] !== '')
            {
              $eval = '$criterion = $c->getNewCriterion('.$this->clase.'Peer::'.strtoupper($key).', date("Y-m-d", $this->filters[$key]["from"]), Criteria::GREATER_EQUAL);';
              eval($eval);
            }
            if (isset($this->filters[$key]['to']) && $this->filters[$key]['to'] !== '')
            {
              if (isset($criterion))
              {
                $eval = '$criterion->addAnd($c->getNewCriterion('.$this->clase.'Peer::'.strtoupper($key).', date("Y-m-d", $this->filters[$key]["to"]), Criteria::LESS_EQUAL));';
                eval($eval);
              }
              else
              {
                $eval = '$criterion = $c->getNewCriterion('.$this->clase.'Peer::'.strtoupper($key).', date("Y-m-d", $this->filters[$key]["to"]), Criteria::LESS_EQUAL);';
                eval($eval);
              }
            }
            if (isset($criterion))
            {
              $c->add($criterion);
            }
          }
   	    }else{
          if (isset($this->filters[$key]) && $this->filters[$key] !== '')
          {
            $eval = '$c->add('.$this->clase.'Peer::'.strtoupper($key).', strtr($this->filters[$key], "*", "%"), Criteria::LIKE);';
            eval($eval);
          }
   	    }
      } //
    } // foreach
    }
  }

  protected function addSortCriteria()
  {
    if ($sort_column = $this->getOpciones('sort'))
    {
      $eval = '$sort_column = '.$this->clase.'Peer::translateFieldName($sort_column, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME);';
      if ($this->getOpciones('type') == 'asc')
      {
        $this->c->addAscendingOrderByColumn($sort_column);
      }
      else
      {
        $this->c->addDescendingOrderByColumn($sort_column);
      }
    }
  }
  
  private function getOpciones($opc, $default = '')
  {
    if(isset($this->opciones[$opc])) return $this->opciones[$opc]; else return $default;
  }
  
  private function getColumCreoleType($campo)
  {
      $col = $this->mapa_tabla->translateFieldName($campo, BasePeer::TYPE_FIELDNAME,BasePeer::TYPE_COLNAME);
      return $this->mapa_tabla->getColum($col)->getCreoleType();
  }
  
  public function getColumName($colum)
  {
	return $this->columnas[$colum];
  }

  public function getColumsNames()
  {
    return $this->columnas;
  }
	
	
  public function getArrayFieldsNames()
  {
    $col = $this->columnas;
    $columnas = array();
    foreach($col as $key => $value)
    {
      $punto = strpos($key,'.');
      $tabla = substr($key,0,$punto);
      $campo = substr($key,$punto+1);
      $columnas[ucfirst(strtolower($campo))] = $value;
    }
    return $columnas;
  }  
  
} 


?>